home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-installer.exe / bin / collections.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2014-12-31  |  24KB  |  640 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. __all__ = [
  5.     'Counter',
  6.     'deque',
  7.     'defaultdict',
  8.     'namedtuple',
  9.     'OrderedDict']
  10. from _abcoll import *
  11. import _abcoll
  12. __all__ += _abcoll.__all__
  13. from _collections import deque, defaultdict
  14. from operator import itemgetter as _itemgetter, eq as _eq
  15. from keyword import iskeyword as _iskeyword
  16. import sys as _sys
  17. import heapq as _heapq
  18. from itertools import repeat as _repeat, chain as _chain, starmap as _starmap
  19. from itertools import imap as _imap
  20.  
  21. try:
  22.     from thread import get_ident as _get_ident
  23. except ImportError:
  24.     from dummy_thread import get_ident as _get_ident
  25.  
  26.  
  27. class OrderedDict(dict):
  28.     '''Dictionary that remembers insertion order'''
  29.     
  30.     def __init__(self, *args, **kwds):
  31.         '''Initialize an ordered dictionary.  The signature is the same as
  32.         regular dictionaries, but keyword arguments are not recommended because
  33.         their insertion order is arbitrary.
  34.  
  35.         '''
  36.         if len(args) > 1:
  37.             raise TypeError('expected at most 1 arguments, got %d' % len(args))
  38.         
  39.         try:
  40.             self._OrderedDict__root
  41.         except AttributeError:
  42.             self._OrderedDict__root = root = []
  43.             root[:] = [
  44.                 root,
  45.                 root,
  46.                 None]
  47.             self._OrderedDict__map = { }
  48.  
  49.         self._OrderedDict__update(*args, **kwds)
  50.  
  51.     
  52.     def __setitem__(self, key, value, dict_setitem = dict.__setitem__):
  53.         '''od.__setitem__(i, y) <==> od[i]=y'''
  54.         if key not in self:
  55.             root = self._OrderedDict__root
  56.             last = root[0]
  57.             last[1] = root[0] = self._OrderedDict__map[key] = [
  58.                 last,
  59.                 root,
  60.                 key]
  61.         return dict_setitem(self, key, value)
  62.  
  63.     
  64.     def __delitem__(self, key, dict_delitem = dict.__delitem__):
  65.         '''od.__delitem__(y) <==> del od[y]'''
  66.         dict_delitem(self, key)
  67.         (link_prev, link_next, _) = self._OrderedDict__map.pop(key)
  68.         link_prev[1] = link_next
  69.         link_next[0] = link_prev
  70.  
  71.     
  72.     def __iter__(self):
  73.         '''od.__iter__() <==> iter(od)'''
  74.         root = self._OrderedDict__root
  75.         curr = root[1]
  76.         while curr is not root:
  77.             yield curr[2]
  78.             curr = curr[1]
  79.  
  80.     
  81.     def __reversed__(self):
  82.         '''od.__reversed__() <==> reversed(od)'''
  83.         root = self._OrderedDict__root
  84.         curr = root[0]
  85.         while curr is not root:
  86.             yield curr[2]
  87.             curr = curr[0]
  88.  
  89.     
  90.     def clear(self):
  91.         '''od.clear() -> None.  Remove all items from od.'''
  92.         root = self._OrderedDict__root
  93.         root[:] = [
  94.             root,
  95.             root,
  96.             None]
  97.         self._OrderedDict__map.clear()
  98.         dict.clear(self)
  99.  
  100.     
  101.     def keys(self):
  102.         '''od.keys() -> list of keys in od'''
  103.         return list(self)
  104.  
  105.     
  106.     def values(self):
  107.         '''od.values() -> list of values in od'''
  108.         return [ self[key] for key in self ]
  109.  
  110.     
  111.     def items(self):
  112.         '''od.items() -> list of (key, value) pairs in od'''
  113.         return [ (key, self[key]) for key in self ]
  114.  
  115.     
  116.     def iterkeys(self):
  117.         '''od.iterkeys() -> an iterator over the keys in od'''
  118.         return iter(self)
  119.  
  120.     
  121.     def itervalues(self):
  122.         '''od.itervalues -> an iterator over the values in od'''
  123.         for k in self:
  124.             yield self[k]
  125.         
  126.  
  127.     
  128.     def iteritems(self):
  129.         '''od.iteritems -> an iterator over the (key, value) pairs in od'''
  130.         for k in self:
  131.             yield (k, self[k])
  132.         
  133.  
  134.     update = MutableMapping.update
  135.     __update = update
  136.     __marker = object()
  137.     
  138.     def pop(self, key, default = __marker):
  139.         '''od.pop(k[,d]) -> v, remove specified key and return the corresponding
  140.         value.  If key is not found, d is returned if given, otherwise KeyError
  141.         is raised.
  142.  
  143.         '''
  144.         if key in self:
  145.             result = self[key]
  146.             del self[key]
  147.             return result
  148.         if None is self._OrderedDict__marker:
  149.             raise KeyError(key)
  150.         return default
  151.  
  152.     
  153.     def setdefault(self, key, default = None):
  154.         '''od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'''
  155.         if key in self:
  156.             return self[key]
  157.         self[key] = None
  158.         return default
  159.  
  160.     
  161.     def popitem(self, last = True):
  162.         '''od.popitem() -> (k, v), return and remove a (key, value) pair.
  163.         Pairs are returned in LIFO order if last is true or FIFO order if false.
  164.  
  165.         '''
  166.         if not self:
  167.             raise KeyError('dictionary is empty')
  168.         key = next(reversed(self) if last else iter(self))
  169.         value = self.pop(key)
  170.         return (key, value)
  171.  
  172.     
  173.     def __repr__(self, _repr_running = { }):
  174.         '''od.__repr__() <==> repr(od)'''
  175.         call_key = (id(self), _get_ident())
  176.         if call_key in _repr_running:
  177.             return '...'
  178.         _repr_running[call_key] = None
  179.         
  180.         try:
  181.             if not self:
  182.                 return '%s()' % (self.__class__.__name__,)
  183.             return None % (self.__class__.__name__, self.items())
  184.         finally:
  185.             del _repr_running[call_key]
  186.  
  187.  
  188.     
  189.     def __reduce__(self):
  190.         '''Return state information for pickling'''
  191.         items = [ [
  192.             k,
  193.             self[k]] for k in self ]
  194.         inst_dict = vars(self).copy()
  195.         for k in vars(OrderedDict()):
  196.             inst_dict.pop(k, None)
  197.         
  198.         if inst_dict:
  199.             return (self.__class__, (items,), inst_dict)
  200.         return (None.__class__, (items,))
  201.  
  202.     
  203.     def copy(self):
  204.         '''od.copy() -> a shallow copy of od'''
  205.         return self.__class__(self)
  206.  
  207.     
  208.     def fromkeys(cls, iterable, value = None):
  209.         '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S.
  210.         If not specified, the value defaults to None.
  211.  
  212.         '''
  213.         self = cls()
  214.         for key in iterable:
  215.             self[key] = value
  216.         
  217.         return self
  218.  
  219.     fromkeys = classmethod(fromkeys)
  220.     
  221.     def __eq__(self, other):
  222.         '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
  223.         while comparison to a regular mapping is order-insensitive.
  224.  
  225.         '''
  226.         if isinstance(other, OrderedDict):
  227.             if dict.__eq__(self, other):
  228.                 pass
  229.             return all(_imap(_eq, self, other))
  230.         return None.__eq__(self, other)
  231.  
  232.     
  233.     def __ne__(self, other):
  234.         '''od.__ne__(y) <==> od!=y'''
  235.         return not (self == other)
  236.  
  237.     
  238.     def viewkeys(self):
  239.         """od.viewkeys() -> a set-like object providing a view on od's keys"""
  240.         return KeysView(self)
  241.  
  242.     
  243.     def viewvalues(self):
  244.         """od.viewvalues() -> an object providing a view on od's values"""
  245.         return ValuesView(self)
  246.  
  247.     
  248.     def viewitems(self):
  249.         """od.viewitems() -> a set-like object providing a view on od's items"""
  250.         return ItemsView(self)
  251.  
  252.  
  253. _class_template = "class {typename}(tuple):\n    '{typename}({arg_list})'\n\n    __slots__ = ()\n\n    _fields = {field_names!r}\n\n    def __new__(_cls, {arg_list}):\n        'Create new instance of {typename}({arg_list})'\n        return _tuple.__new__(_cls, ({arg_list}))\n\n    @classmethod\n    def _make(cls, iterable, new=tuple.__new__, len=len):\n        'Make a new {typename} object from a sequence or iterable'\n        result = new(cls, iterable)\n        if len(result) != {num_fields:d}:\n            raise TypeError('Expected {num_fields:d} arguments, got %d' % len(result))\n        return result\n\n    def __repr__(self):\n        'Return a nicely formatted representation string'\n        return '{typename}({repr_fmt})' % self\n\n    def _asdict(self):\n        'Return a new OrderedDict which maps field names to their values'\n        return OrderedDict(zip(self._fields, self))\n\n    def _replace(_self, **kwds):\n        'Return a new {typename} object replacing specified fields with new values'\n        result = _self._make(map(kwds.pop, {field_names!r}, _self))\n        if kwds:\n            raise ValueError('Got unexpected field names: %r' % kwds.keys())\n        return result\n\n    def __getnewargs__(self):\n        'Return self as a plain tuple.  Used by copy and pickle.'\n        return tuple(self)\n\n    __dict__ = _property(_asdict)\n\n    def __getstate__(self):\n        'Exclude the OrderedDict from pickling'\n        pass\n\n{field_defs}\n"
  254. _repr_template = '{name}=%r'
  255. _field_template = "    {name} = _property(_itemgetter({index:d}), doc='Alias for field number {index:d}')\n"
  256.  
  257. def namedtuple(typename, field_names, verbose = False, rename = False):
  258.     """Returns a new subclass of tuple with named fields.
  259.  
  260.     >>> Point = namedtuple('Point', ['x', 'y'])
  261.     >>> Point.__doc__                   # docstring for the new class
  262.     'Point(x, y)'
  263.     >>> p = Point(11, y=22)             # instantiate with positional args or keywords
  264.     >>> p[0] + p[1]                     # indexable like a plain tuple
  265.     33
  266.     >>> x, y = p                        # unpack like a regular tuple
  267.     >>> x, y
  268.     (11, 22)
  269.     >>> p.x + p.y                       # fields also accessable by name
  270.     33
  271.     >>> d = p._asdict()                 # convert to a dictionary
  272.     >>> d['x']
  273.     11
  274.     >>> Point(**d)                      # convert from a dictionary
  275.     Point(x=11, y=22)
  276.     >>> p._replace(x=100)               # _replace() is like str.replace() but targets named fields
  277.     Point(x=100, y=22)
  278.  
  279.     """
  280.     if isinstance(field_names, basestring):
  281.         field_names = field_names.replace(',', ' ').split()
  282.     field_names = map(str, field_names)
  283.     if rename:
  284.         seen = set()
  285.         for index, name in enumerate(field_names):
  286.             if not all((lambda .0: pass)(name)) and _iskeyword(name) and not name and name[0].isdigit() and name.startswith('_') or name in seen:
  287.                 field_names[index] = '_%d' % index
  288.             seen.add(name)
  289.         
  290.     for name in [
  291.         typename] + field_names:
  292.         if not all((lambda .0: pass)(name)):
  293.             raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name)
  294.         if _iskeyword(name):
  295.             raise ValueError('Type names and field names cannot be a keyword: %r' % name)
  296.         if name[0].isdigit():
  297.             raise ValueError('Type names and field names cannot start with a number: %r' % name)
  298.     
  299.     seen = set()
  300.     for name in field_names:
  301.         if name.startswith('_') and not rename:
  302.             raise ValueError('Field names cannot start with an underscore: %r' % name)
  303.         if name in seen:
  304.             raise ValueError('Encountered duplicate field name: %r' % name)
  305.         seen.add(name)
  306.     
  307.     class_definition = _class_template.format(typename = typename, field_names = tuple(field_names), num_fields = len(field_names), arg_list = repr(tuple(field_names)).replace("'", '')[1:-1], repr_fmt = ', '.join((lambda .0: pass)(field_names)), field_defs = '\n'.join((lambda .0: pass)(enumerate(field_names))))
  308.     if verbose:
  309.         print class_definition
  310.     namespace = dict(_itemgetter = _itemgetter, __name__ = 'namedtuple_%s' % typename, OrderedDict = OrderedDict, _property = property, _tuple = tuple)
  311.     
  312.     try:
  313.         exec class_definition in namespace
  314.     except SyntaxError:
  315.         e = None
  316.         raise SyntaxError(e.message + ':\n' + class_definition)
  317.  
  318.     result = namespace[typename]
  319.     
  320.     try:
  321.         result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')
  322.     except (AttributeError, ValueError):
  323.         pass
  324.  
  325.     return result
  326.  
  327.  
  328. class Counter(dict):
  329.     """Dict subclass for counting hashable items.  Sometimes called a bag
  330.     or multiset.  Elements are stored as dictionary keys and their counts
  331.     are stored as dictionary values.
  332.  
  333.     >>> c = Counter('abcdeabcdabcaba')  # count elements from a string
  334.  
  335.     >>> c.most_common(3)                # three most common elements
  336.     [('a', 5), ('b', 4), ('c', 3)]
  337.     >>> sorted(c)                       # list all unique elements
  338.     ['a', 'b', 'c', 'd', 'e']
  339.     >>> ''.join(sorted(c.elements()))   # list elements with repetitions
  340.     'aaaaabbbbcccdde'
  341.     >>> sum(c.values())                 # total of all counts
  342.     15
  343.  
  344.     >>> c['a']                          # count of letter 'a'
  345.     5
  346.     >>> for elem in 'shazam':           # update counts from an iterable
  347.     ...     c[elem] += 1                # by adding 1 to each element's count
  348.     >>> c['a']                          # now there are seven 'a'
  349.     7
  350.     >>> del c['b']                      # remove all 'b'
  351.     >>> c['b']                          # now there are zero 'b'
  352.     0
  353.  
  354.     >>> d = Counter('simsalabim')       # make another counter
  355.     >>> c.update(d)                     # add in the second counter
  356.     >>> c['a']                          # now there are nine 'a'
  357.     9
  358.  
  359.     >>> c.clear()                       # empty the counter
  360.     >>> c
  361.     Counter()
  362.  
  363.     Note:  If a count is set to zero or reduced to zero, it will remain
  364.     in the counter until the entry is deleted or the counter is cleared:
  365.  
  366.     >>> c = Counter('aaabbc')
  367.     >>> c['b'] -= 2                     # reduce the count of 'b' by two
  368.     >>> c.most_common()                 # 'b' is still in, but its count is zero
  369.     [('a', 3), ('c', 1), ('b', 0)]
  370.  
  371.     """
  372.     
  373.     def __init__(self, iterable = None, **kwds):
  374.         """Create a new, empty Counter object.  And if given, count elements
  375.         from an input iterable.  Or, initialize the count from another mapping
  376.         of elements to their counts.
  377.  
  378.         >>> c = Counter()                           # a new, empty counter
  379.         >>> c = Counter('gallahad')                 # a new counter from an iterable
  380.         >>> c = Counter({'a': 4, 'b': 2})           # a new counter from a mapping
  381.         >>> c = Counter(a=4, b=2)                   # a new counter from keyword args
  382.  
  383.         """
  384.         super(Counter, self).__init__()
  385.         self.update(iterable, **kwds)
  386.  
  387.     
  388.     def __missing__(self, key):
  389.         '''The count of elements not in the Counter is zero.'''
  390.         return 0
  391.  
  392.     
  393.     def most_common(self, n = None):
  394.         """List the n most common elements and their counts from the most
  395.         common to the least.  If n is None, then list all element counts.
  396.  
  397.         >>> Counter('abcdeabcdabcaba').most_common(3)
  398.         [('a', 5), ('b', 4), ('c', 3)]
  399.  
  400.         """
  401.         if n is None:
  402.             return sorted(self.iteritems(), key = _itemgetter(1), reverse = True)
  403.         return None.nlargest(n, self.iteritems(), key = _itemgetter(1))
  404.  
  405.     
  406.     def elements(self):
  407.         """Iterator over elements repeating each as many times as its count.
  408.  
  409.         >>> c = Counter('ABCABC')
  410.         >>> sorted(c.elements())
  411.         ['A', 'A', 'B', 'B', 'C', 'C']
  412.  
  413.         # Knuth's example for prime factors of 1836:  2**2 * 3**3 * 17**1
  414.         >>> prime_factors = Counter({2: 2, 3: 3, 17: 1})
  415.         >>> product = 1
  416.         >>> for factor in prime_factors.elements():     # loop over factors
  417.         ...     product *= factor                       # and multiply them
  418.         >>> product
  419.         1836
  420.  
  421.         Note, if an element's count has been set to zero or is a negative
  422.         number, elements() will ignore it.
  423.  
  424.         """
  425.         return _chain.from_iterable(_starmap(_repeat, self.iteritems()))
  426.  
  427.     
  428.     def fromkeys(cls, iterable, v = None):
  429.         raise NotImplementedError('Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')
  430.  
  431.     fromkeys = classmethod(fromkeys)
  432.     
  433.     def update(self, iterable = None, **kwds):
  434.         """Like dict.update() but add counts instead of replacing them.
  435.  
  436.         Source can be an iterable, a dictionary, or another Counter instance.
  437.  
  438.         >>> c = Counter('which')
  439.         >>> c.update('witch')           # add elements from another iterable
  440.         >>> d = Counter('watch')
  441.         >>> c.update(d)                 # add elements from another counter
  442.         >>> c['h']                      # four 'h' in which, witch, and watch
  443.         4
  444.  
  445.         """
  446.         if iterable is not None:
  447.             if isinstance(iterable, Mapping):
  448.                 if self:
  449.                     self_get = self.get
  450.                     for elem, count in iterable.iteritems():
  451.                         self[elem] = self_get(elem, 0) + count
  452.                     
  453.                 else:
  454.                     super(Counter, self).update(iterable)
  455.             else:
  456.                 self_get = self.get
  457.                 for elem in iterable:
  458.                     self[elem] = self_get(elem, 0) + 1
  459.                 
  460.         if kwds:
  461.             self.update(kwds)
  462.  
  463.     
  464.     def subtract(self, iterable = None, **kwds):
  465.         """Like dict.update() but subtracts counts instead of replacing them.
  466.         Counts can be reduced below zero.  Both the inputs and outputs are
  467.         allowed to contain zero and negative counts.
  468.  
  469.         Source can be an iterable, a dictionary, or another Counter instance.
  470.  
  471.         >>> c = Counter('which')
  472.         >>> c.subtract('witch')             # subtract elements from another iterable
  473.         >>> c.subtract(Counter('watch'))    # subtract elements from another counter
  474.         >>> c['h']                          # 2 in which, minus 1 in witch, minus 1 in watch
  475.         0
  476.         >>> c['w']                          # 1 in which, minus 1 in witch, minus 1 in watch
  477.         -1
  478.  
  479.         """
  480.         if iterable is not None:
  481.             self_get = self.get
  482.             if isinstance(iterable, Mapping):
  483.                 for elem, count in iterable.items():
  484.                     self[elem] = self_get(elem, 0) - count
  485.                 
  486.             else:
  487.                 for elem in iterable:
  488.                     self[elem] = self_get(elem, 0) - 1
  489.                 
  490.         if kwds:
  491.             self.subtract(kwds)
  492.  
  493.     
  494.     def copy(self):
  495.         '''Return a shallow copy.'''
  496.         return self.__class__(self)
  497.  
  498.     
  499.     def __reduce__(self):
  500.         return (self.__class__, (dict(self),))
  501.  
  502.     
  503.     def __delitem__(self, elem):
  504.         '''Like dict.__delitem__() but does not raise KeyError for missing values.'''
  505.         if elem in self:
  506.             super(Counter, self).__delitem__(elem)
  507.  
  508.     
  509.     def __repr__(self):
  510.         if not self:
  511.             return '%s()' % self.__class__.__name__
  512.         items = None.join(map('%r: %r'.__mod__, self.most_common()))
  513.         return '%s({%s})' % (self.__class__.__name__, items)
  514.  
  515.     
  516.     def __add__(self, other):
  517.         """Add counts from two counters.
  518.  
  519.         >>> Counter('abbb') + Counter('bcc')
  520.         Counter({'b': 4, 'c': 2, 'a': 1})
  521.  
  522.         """
  523.         if not isinstance(other, Counter):
  524.             return NotImplemented
  525.         result = None()
  526.         for elem, count in self.items():
  527.             newcount = count + other[elem]
  528.             if newcount > 0:
  529.                 result[elem] = newcount
  530.                 continue
  531.         for elem, count in other.items():
  532.             if elem not in self and count > 0:
  533.                 result[elem] = count
  534.                 continue
  535.         return result
  536.  
  537.     
  538.     def __sub__(self, other):
  539.         """ Subtract count, but keep only results with positive counts.
  540.  
  541.         >>> Counter('abbbc') - Counter('bccd')
  542.         Counter({'b': 2, 'a': 1})
  543.  
  544.         """
  545.         if not isinstance(other, Counter):
  546.             return NotImplemented
  547.         result = None()
  548.         for elem, count in self.items():
  549.             newcount = count - other[elem]
  550.             if newcount > 0:
  551.                 result[elem] = newcount
  552.                 continue
  553.         for elem, count in other.items():
  554.             if elem not in self and count < 0:
  555.                 result[elem] = 0 - count
  556.                 continue
  557.         return result
  558.  
  559.     
  560.     def __or__(self, other):
  561.         """Union is the maximum of value in either of the input counters.
  562.  
  563.         >>> Counter('abbb') | Counter('bcc')
  564.         Counter({'b': 3, 'c': 2, 'a': 1})
  565.  
  566.         """
  567.         if not isinstance(other, Counter):
  568.             return NotImplemented
  569.         result = None()
  570.         for elem, count in self.items():
  571.             other_count = other[elem]
  572.             newcount = other_count if count < other_count else count
  573.             if newcount > 0:
  574.                 result[elem] = newcount
  575.                 continue
  576.         for elem, count in other.items():
  577.             if elem not in self and count > 0:
  578.                 result[elem] = count
  579.                 continue
  580.         return result
  581.  
  582.     
  583.     def __and__(self, other):
  584.         """ Intersection is the minimum of corresponding counts.
  585.  
  586.         >>> Counter('abbb') & Counter('bcc')
  587.         Counter({'b': 1})
  588.  
  589.         """
  590.         if not isinstance(other, Counter):
  591.             return NotImplemented
  592.         result = None()
  593.         for elem, count in self.items():
  594.             other_count = other[elem]
  595.             newcount = count if count < other_count else other_count
  596.             if newcount > 0:
  597.                 result[elem] = newcount
  598.                 continue
  599.         return result
  600.  
  601.  
  602. if __name__ == '__main__':
  603.     from cPickle import loads, dumps
  604.     Point = namedtuple('Point', 'x, y', True)
  605.     p = Point(x = 10, y = 20)
  606.     if not p == loads(dumps(p)):
  607.         raise AssertionError
  608.     
  609.     class Point(namedtuple('Point', 'x y')):
  610.         __slots__ = ()
  611.         
  612.         def hypot(self):
  613.             return (self.x ** 2 + self.y ** 2) ** 0.5
  614.  
  615.         hypot = property(hypot)
  616.         
  617.         def __str__(self):
  618.             return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)
  619.  
  620.  
  621.     for p in (Point(3, 4), Point(14, 5 / 7)):
  622.         print p
  623.     
  624.     
  625.     class Point(namedtuple('Point', 'x y')):
  626.         '''Point class with optimized _make() and _replace() without error-checking'''
  627.         __slots__ = ()
  628.         _make = classmethod(tuple.__new__)
  629.         
  630.         def _replace(self, _map = map, **kwds):
  631.             return self._make(_map(kwds.get, ('x', 'y'), self))
  632.  
  633.  
  634.     print Point(11, 22)._replace(x = 100)
  635.     Point3D = namedtuple('Point3D', Point._fields + ('z',))
  636.     print Point3D.__doc__
  637.     import doctest
  638.     TestResults = namedtuple('TestResults', 'failed attempted')
  639.     print TestResults(*doctest.testmod())
  640.